package com.huyi.zxing;

import android.app.Activity;
import android.content.res.AssetFileDescriptor;
import android.graphics.Bitmap;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.os.Bundle;
import android.os.Handler;
import android.os.Vibrator;
import android.view.Gravity;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.Toast;

import com.bean.ShowTip;
import com.google.gson.Gson;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.Result;
import com.utils.SharedPreferencesUtils;
import com.utils.UrlUtlis;
import com.zhy.http.okhttp.OkHttpUtils;
import com.zhy.http.okhttp.callback.StringCallback;
import com.zzl.util.LightControl;

import java.io.IOException;
import java.util.Vector;

import demo.zdc.com.myapplication.R;
import okhttp3.Call;

/**
 * Initial the camera
 * @author Ryan.Tang
 */
public class CaptureActivity extends Activity implements Callback {

	private CaptureActivityHandler handler;
	private ViewfinderView viewfinderView;
	private boolean hasSurface;
	private Vector<BarcodeFormat> decodeFormats;
	private String characterSet;
	private InactivityTimer inactivityTimer;
	private MediaPlayer mediaPlayer;
	private boolean playBeep;
	private static final float BEEP_VOLUME = 0.10f;
	private boolean vibrate;
	private ImageView cancelScanButton;
	private ImageView btn_light_control;
	private boolean isShow=false;

	private ProgressBar pg;
	private ImageView iv_pg_bg_grey;
	private ImageView iv_big_circle;
//	private ImageView iv_four_corner;
	private ImageView mBack;
	private ImageView btn_pressScan;


	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.camera_diy);
		pg = (ProgressBar) findViewById(R.id.pg_camera_diy);
		iv_pg_bg_grey = (ImageView) findViewById(R.id.iv_camera_diy);
		iv_big_circle = (ImageView) findViewById(R.id.iv_camera_diy_circle);
//		iv_four_corner = (ImageView) findViewById(R.id.iv_camera_diy_corner);
		//ViewUtil.addTopView(getApplicationContext(), this, R.string.scan_card);
		CameraManager.init(getApplication());
		viewfinderView = (ViewfinderView) findViewById(R.id.viewfinder_view);
		cancelScanButton = (ImageView) this.findViewById(R.id.btn_cancel_scan);
		btn_light_control = (ImageView) this.findViewById(R.id.btn_light_control);
		mBack = (ImageView) this.findViewById(R.id.btn_left);
		btn_pressScan = (ImageView) this.findViewById(R.id.btn_PressScan);

		btn_pressScan.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				ToScan();
			}
		});

		mBack.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {

				finish();
			}
		});
		hasSurface = true;
		/*btn_pressScan.setOnTouchListener(new View.OnTouchListener() {
			@Override
			public boolean onTouch(View v, MotionEvent event) {
				switch (event.getAction()){
					case MotionEvent.ACTION_DOWN:
						ToScan();
						break;
					case MotionEvent.ACTION_MOVE:
						ToScan();
						break;
					case MotionEvent.ACTION_UP:
						hasSurface = false;
						break;
				}
				return false;
			}
		});*/
	/*	if(btn_pressScan.isPressed()||btn_pressScan.isSelected()){
		//	onResume();
			ToScan();
		}*/


		inactivityTimer = new InactivityTimer(this);
	}

	@Override
	protected void onResume() {
		super.onResume();

	/*	btn_pressScan.setOnLongClickListener(new View.OnLongClickListener() {
			@Override
			public boolean onLongClick(View v) {
				//调用扫描方法
				//Toast.makeText(getApplicationContext(),"按住扫描又走此方法",Toast.LENGTH_SHORT).show();
				ToScan();
				return true;

			}

		});*/
		//ToScan();

	}

	//调用扫描的方法
	public void ToScan(){

		SurfaceView surfaceView = (SurfaceView) findViewById(R.id.preview_view);
		SurfaceHolder surfaceHolder = surfaceView.getHolder();
		if (hasSurface) {
			initCamera(surfaceHolder);
		} else {
			surfaceHolder.addCallback(this);
			surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
		}
		decodeFormats = null;
		characterSet = null;

		playBeep = true;
		AudioManager audioService = (AudioManager) getSystemService(AUDIO_SERVICE);
		if (audioService.getRingerMode() != AudioManager.RINGER_MODE_NORMAL) {
			playBeep = false;
		}
		initBeepSound();
		vibrate = true;

		//quit the scan view
		cancelScanButton.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				CaptureActivity.this.finish();
			}
		});
		btn_light_control.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				LightControl mLightControl = new LightControl();

				if(isShow){
					isShow = false;
					btn_light_control.setBackgroundResource(R.mipmap.torch_off);
					Toast.makeText(getApplicationContext(), "闪光灯关闭", Toast.LENGTH_LONG).show();
					mLightControl.turnOff();
				}else{
					isShow = true;
					btn_light_control.setBackgroundResource(R.mipmap.torch_on);
					mLightControl.turnOn();
					Toast.makeText(getApplicationContext(), "闪光灯开启", Toast.LENGTH_LONG).show();
				}


			}
		});

		mBack.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				finish();
			}
		});


	}

	@Override
	protected void onPause() {
		super.onPause();
		if (handler != null) {
			handler.quitSynchronously();
			handler = null;
		}
		CameraManager.get().closeDriver();
	}

	@Override
	protected void onDestroy() {
		inactivityTimer.shutdown();
		super.onDestroy();
	}

	/**
	 * Handler scan result
	 * @param result
	 * @param barcode
	 */
	public void handleDecode(Result result, Bitmap barcode)  {
		inactivityTimer.onActivity();
		playBeepSoundAndVibrate();
		String resultString = result.getText();
		//FIXME
		if (resultString.equals("")) {
			Toast.makeText(CaptureActivity.this, "Scan failed!", Toast.LENGTH_SHORT).show();
		}else {
     		System.out.println("Result:"+resultString);
			Toast toast = Toast.makeText(getApplicationContext(), "扫描成功，扫得二维码为：" + resultString, Toast.LENGTH_SHORT);

			toast.setGravity(Gravity.TOP,0,100);
			toast.show();
			if(pg!=null&&pg.isShown()){
				pg.setVisibility(View.GONE);
				iv_pg_bg_grey.setVisibility(View.VISIBLE);
				iv_big_circle.setBackgroundResource(R.mipmap.bar_code_center_grey);
//				iv_four_corner.setBackgroundResource(R.mipmap.bar_code_four_corner_grey);
			}
			/*Intent intent = new Intent(CaptureActivity.this, ScannerShow.class);
			intent.putExtra("erCode",resultString);
			startActivity(intent);
			finish();*/

			hasSurface = true;
			/**
			 * 调用扫描接口
			 */

			OkHttpUtils.get()
					   .url(UrlUtlis.SCAN)
					   .addParams("exhibition_id", SharedPreferencesUtils.getInt(getApplicationContext(),"exhibit",0)+"")
					   .addParams("clearing_name_id",SharedPreferencesUtils.getInt(getApplicationContext(),"userNo",0)+"")
					   .addParams("ticket_id",resultString)
					   .build()
					   .execute(new StringCallback() {
						   @Override
						   public void onError(Call call, Exception e, int id) {

						   }

						   @Override
						   public void onResponse(String response, int id) {
							   Gson gson = new Gson();
							   ShowTip showTip = gson.fromJson(response, ShowTip.class);
							   Toast.makeText(getApplicationContext(),showTip.getMessage(),Toast.LENGTH_LONG).show();
						   }
					   });


			Thread thread = new Thread();
			try {
				thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}


		/*	btn_pressScan.setOnTouchListener(new View.OnTouchListener() {
				@Override
				public boolean onTouch(View v, MotionEvent event) {
					switch (event.getAction()){
						case MotionEvent.ACTION_DOWN:
							ToScan();
							break;
						case MotionEvent.ACTION_MOVE:
							break;
						case MotionEvent.ACTION_UP:
							hasSurface = true;
							break;
					}
					return false;
				}
			});
*/

	/*		if(btn_pressScan.isPressed()||btn_pressScan.isSelected()){

				ToScan();
			}*/

			//onResume();
		/*	Intent resultIntent = new Intent();
			Bundle bundle = new Bundle();
			bundle.putString("result", resultString);
			resultIntent.putExtras(bundle);
			this.setResult(RESULT_OK, resultIntent);*/
		}
		//CaptureActivity.this.finish();
	}

	private void initCamera(SurfaceHolder surfaceHolder) {
		try {
			CameraManager.get().openDriver(surfaceHolder);
		} catch (IOException ioe) {
			return;
		} catch (RuntimeException e) {
			return;
		}
		if (handler == null) {
			handler = new CaptureActivityHandler(this, decodeFormats,
					characterSet);
		}else{
			handler.restartPreviewAndDecode();
		}
	}

	@Override
	public void surfaceChanged(SurfaceHolder holder, int format, int width,
							   int height) {

	}

	@Override
	public void surfaceCreated(SurfaceHolder holder) {
		if (!hasSurface) {
			hasSurface = true;
			initCamera(holder);
		}

	}

	@Override
	public void surfaceDestroyed(SurfaceHolder holder) {
		hasSurface = false;

	}

	public ViewfinderView getViewfinderView() {
		return viewfinderView;
	}

	public Handler getHandler() {
		return handler;
	}

	public void drawViewfinder() {
		viewfinderView.drawViewfinder();

	}

	private void initBeepSound() {
		if (playBeep && mediaPlayer == null) {
			// The volume on STREAM_SYSTEM is not adjustable, and users found it
			// too loud,
			// so we now play on the music stream.
			setVolumeControlStream(AudioManager.STREAM_MUSIC);
			mediaPlayer = new MediaPlayer();
			mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
			mediaPlayer.setOnCompletionListener(beepListener);

			AssetFileDescriptor file = getResources().openRawResourceFd(
					R.raw.beep);
			try {
				mediaPlayer.setDataSource(file.getFileDescriptor(),
						file.getStartOffset(), file.getLength());
				file.close();
				mediaPlayer.setVolume(BEEP_VOLUME, BEEP_VOLUME);
				mediaPlayer.prepare();
			} catch (IOException e) {
				mediaPlayer = null;
			}
		}
	}

	private static final long VIBRATE_DURATION = 200L;

	private void playBeepSoundAndVibrate() {
		if (playBeep && mediaPlayer != null) {
			mediaPlayer.start();
		}
		if (vibrate) {
			Vibrator vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE);
			vibrator.vibrate(VIBRATE_DURATION);
		}
	}

	/**
	 * When the beep has finished playing, rewind to queue up another one.
	 */
	private final OnCompletionListener beepListener = new OnCompletionListener() {
		public void onCompletion(MediaPlayer mediaPlayer) {
			mediaPlayer.seekTo(0);
		}
	};
}